home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Pier Shareware 1
/
Pier Shareware 1.iso
/
031a
/
posit.arc
/
POS.ASM
next >
Wrap
Assembly Source File
|
1987-10-18
|
7KB
|
181 lines
NAME POSITIVE
; Porgram POS.ASM
; Purpose To utilize subliminal advertisement for POSITIVE ideas.
; Input FROM DOS
; POS I will quit smoking.
; POS I do not enjoy smoking.
; Output Once every three seconds the message will be displayed on the
; CRT and then erased with virtually no effect on current contents
; of the video.
PAGE 60,132
SYS SEGMENT AT 0
INTERUPT EQU $
SYS ENDS
.MODEL LARGE
.CODE
ORG 127 ; STARTING
COUNTER DB ? ; COUNTER FOR TICS
BUFCNT DB ? ; CHARACTERS IN BUFFER 127 MAX
BUFFER DB 127 DUP (?) ; COMMAND LINE BUFFER
COLS EQU 13 ; COLUMN NUMBER FOR DISPLAY
BYTES EQU 160 ; NUMBER OF BYTES PER LINE
MAIN PROC FAR
VIDSEG LABEL WORD ; ADDRESS OF VIDEO SEGMENT
JMP SHORT INIT ; INITIALIZE
VIDOFFSET DW ? ; OFFSET FOR WRITES
VIDSTA DW ? ; VIDEO STATUS PORT
DOIT PROC NEAR
ASSUME DS:@CODE
STI
PUSHF ; FAKE THE INTERUPT
ORG $+1
OLDINT DW 2 DUP (?) ; OLD INTERUPT 08
ORG $-5
CALL FAR PTR INTERUPT ; OFF TO ORIGINAL INTERUPT
PUSH AX ; SAVE WORKING REGISTERS
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH DS
PUSH ES
PUSH CS
POP DS
MOV AX,VIDSEG ; GET VIDEO SEGMENT COVERAGE
MOV ES,AX
MOV DX,VIDSTA ; GET STATUS PORT
DEC COUNTER ; TIME TO DISPLAY THE MESSAGE?
JNZ SHOWEND ; EXIT
MOV COUNTER,36 ; 1 TIME every 3 seconds
MOV DI,VIDOFFSET ; SAVE FOR STRING OPERATIONS
LEA SI,BUFFER ; POINTER TO BUFFER
MOV CL,BUFCNT ; BYTE COUNT TO CL
XOR CH,CH ; SETUP FOR LOOP
CALL NOSNOW ; CHECK FOR RETRACE
WRITE:
MOV BL,BYTE PTR ES:[DI] ; SAVE CURRENT CONTENTS OF SCREEN
MOV BYTE PTR [SI+64],BL ; SO I CAN RESTORE IT LATER
MOVSB
INC DI ; ADJUST FOR ATTRIBUTE
LOOP WRITE ; FINISH
LEA SI,BUFFER+64
MOV DI,VIDOFFSET
MOV CL,BUFCNT ; GET COUNT
XOR CH,CH ; CLEAR UPPER HALF
CALL NOSNOW
RESTLOOP:
MOVSB
INC DI ; ADJUST FOR ATTRIBUTE
LOOP RESTLOOP ; FINISH
SHOWEND:
POP ES
POP DS
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
IRET
DOIT ENDP
NOSNOW PROC NEAR
CMP DX,0 ; CHECK FOR SNOW
JZ SNOWEND ; NO
PUSH AX
WAIT1:
IN AL,DX
AND AL,1
JNZ WAIT1
WAIT2:
IN AL,DX
AND AL,8
JZ WAIT2
POP AX
SNOWEND:
RET
NOSNOW ENDP
INIT: ASSUME DS:NOTHING
MOV CL,BUFCNT ; GET BUFFER SIZE
CMP CL,0 ; ANYTHING THERE ?
JA BEGIN ; YES
INTERR:
MOV DX,OFFSET ERR ; POINTER TO ERROR MSG
MOV AH,9
INT 21H
MOV AX,4C01H
INT 21H ; TERMINATE
ERR DB 13,10,'No message on input. Terminating...',13,10,'$'
BEGIN:
LEA SI,BUFFER ; POINT TO MESSAGE AREA
LOAD:
LODSB ; INPUT A BYTE
CMP AL,9 ; CHECK FOR TAB
JE LOAD ; TRY AGAIN..
CMP AL,32 ; MAYBE A SPACE
JE LOAD ; TRY NEXT
CMP AL,13 ; HOW ABOUT CR
JNE FOUND ; PROCESS MESSAGE
JMP INTERR ; CR FOUND BUT NO DATA....
FOUND:
XOR CH,CH ; CLEAR UPPER HALF
SHL CX,1 ; EVEN OFF TO 160
MOV AX,BYTES
SUB AX,CX ; CLACULATE
SHR AX,1 ; CENTER TEXT
ADD AX,COLS*BYTES ; SET TO ROW/COLUMN
TEST AL,1 ; ODD NUMBER ?
JZ NOTODD ; NO
INC AX
NOTODD:
MOV VIDOFFSET,AX ; SAVE FOR INTERUPT
MOV AX,40H ; POINT TO PARAMETER TABLE
MOV ES,AX ; COVER WITH ES
MOV BX,0B000H ; ASSUME CGA FOR NOW
MOV DX,0 ; WITH STATUS PORT SAME
MOV AL,ES:[10h] ; GET EQUIPMENT FLAG BYTE
AND AL,30H ; IS IT MONO
JZ MONO ; YES
MOV DX,03DAH ; SETUP FOR CGA
ADD BX,800H ; INC TO SEGMENT
MOV AL,ES:[87] ; GET EGA BYTE
CMP AL,0 ; IS IT EGA?
JZ MONO ; NO CONTINUE
MOV DX,0 ; YES - NOSNOW HERE
MONO:
MOV VIDSEG,BX ; SAVE SEGMENT
MOV VIDSTA,DX ; SAVE STATUS PORT
MOV AX,3508H ; GET CURRENT INTERUPT
INT 21H
MOV OLDINT,BX ; SAVE FOR THIS ROUTINE
MOV OLDINT[2],ES
MOV COUNTER,1 ; INITIALIZE THE COUNTER
MOV DX,OFFSET DOIT ; READY FOR RESIDENTCY
MOV AX,2508H
INT 21H
MOV DX,OFFSET INIT ; INIT IS END
INT 27H
MAIN ENDP
END MAIN